const Set = require('../template')

function testSetComplexScenarios() {
  // 1. 复杂嵌套对象+数组混合设置
  console.log(
    "1. 复杂嵌套对象+数组混合设置:",
    (() => {
      const obj = {
        user: {
          info: { name: 'John' },
          orders: [{ id: 1, items: [101] }]
        }
      }
      // 设置用户地址 + 订单2 + 订单1的第二个商品
      Set.set(obj, 'user.info.address', '123 St')
      Set.set(obj, 'user.orders[1]', { id: 2, items: [] })
      Set.set(obj, 'user.orders[0].items[1]', 102)

      return obj.user.info.address === '123 St' &&
        obj.user.orders[1].id === 2 &&
        obj.user.orders[0].items[1] === 102
    })()
  )

  // 2. 跨层级null父对象处理
  console.log(
    "2. 跨层级null父对象处理:",
    (() => {
      const obj = { a: null }
      // 修复null父对象并设置子属性
      Set.set(obj, 'a.b.c', 42)
      return obj.a !== null && typeof obj.a === 'object' && obj.a.b.c === 42
    })()
  )

  // 3. 多方法组合使用（转换+验证+条件）
  console.log(
    "3. 多方法组合使用（转换+验证+条件）:",
    (() => {
      const obj = { product: {} }
      const schema = { type: 'number', min: 0 } // 验证：非负数字
      const transform = (val) => Number(val) // 转换：字符串转数字
      const condition = (val) => val > 10 // 条件：值大于10

      // 先转换，再验证，最后满足条件才设置
      const transformedVal = transform('99')
      Set.setWithValidation(obj, 'product.price', transformedVal, schema)
      Set.setWithCondition(obj, 'product.price', 5, condition) // 条件不满足，不覆盖

      return obj.product.price === 99
    })()
  )

// 4. 异步+并发组合处理多路径
  async function testAsyncConcurrent() {
    const obj = { data: {} }
    // 异步处理：模拟API数据格式化
    const asyncProcessor = async (val) => {
      await new Promise(resolve => setTimeout(resolve, 1))
      return val.toUpperCase()
    }
    // 并发设置3个路径
    const paths = ['data.name', 'data.title', 'data.label']
    await Set.setConcurrent(obj, paths, 'test', asyncProcessor, 2)

    return obj.data.name === 'TEST' &&
      obj.data.title === 'TEST' &&
      obj.data.label === 'TEST'
  }

  console.log(
    '4. 异步+并发组合处理多路径:',
    testAsyncConcurrent()
  )

  // 5. 深度限制+统计跟踪复杂设置
  console.log(
    "5. 深度限制+统计跟踪复杂设置:",
    (() => {
      const obj = {}
      const maxDepth = 4
      // 深度4：level1.level2.level3.key（允许）
      const stats1 = Set.setWithStats(Set.setDeep(obj, 'level1.level2.level3.key', 'ok', maxDepth))
      // 深度5：level1.level2.level3.level4.key（禁止）
      const stats2 = Set.setWithStats(Set.setDeep(obj, 'level1.level2.level3.level4.key', 'no', maxDepth))

      return stats1.success === true &&
        stats2.success === false &&
        obj.level1.level2.level3.key === 'ok' &&
        obj.level1.level2.level3.level4 === undefined
    })()
  )

  // 6. 循环引用对象安全设置
  console.log(
    "6. 循环引用对象安全设置:",
    (() => {
      const obj = { a: 1 }
      obj.self = obj // 循环引用
      try {
        Set.set(obj, 'self.b', 2)
        return obj.self.b === 2 && obj.b === undefined // 只修改self指向的对象
      } catch (e) {
        return false // 不应抛出错误
      }
    })()
  )

  // 7. 大规模配置对象批量更新
  console.log(
    "7. 大规模配置对象批量更新:",
    (() => {
      const config = {
        server: { port: 8080 },
        database: { host: 'localhost' },
        log: { level: 'info' }
      }
      // 批量更新多模块配置
      const updatePaths = [
        'server.port',
        'database.host',
        'database.port',
        'log.level',
        'log.file'
      ]
      const updateValues = [8081, 'db.example.com', 3306, 'warn', 'app.log']

      updatePaths.forEach((path, idx) => {
        Set.set(config, path, updateValues[idx])
      })

      return config.server.port === 8081 &&
        config.database.host === 'db.example.com' &&
        config.database.port === 3306 &&
        config.log.level === 'warn' &&
        config.log.file === 'app.log'
    })()
  )
}

// 执行复杂场景测试
console.log("=== Set 复杂场景测试 ===")
testSetComplexScenarios()
console.log("=== Set 复杂场景测试完成 ===")
